package cn.t12.quartzspringbootdemo.service;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Component
public class ScheduledService {
    private static Logger logger = LoggerFactory.getLogger(ScheduledService.class);
    // // 每延迟5秒一次
    // @Scheduled(fixedDelay = 5000)
    // // 当前方法调用的时候,是在一个单独的线程中执行
    // // @Async注解要生效的话,也需要使用@EnableAsync来开启
    // @Async
    // public void remindTask(){
    //     logger.info("开始提醒任务...,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    //     try {
    //         TimeUnit.SECONDS.sleep(8);
    //     } catch (InterruptedException e) {
    //         e.printStackTrace();
    //     }
    //     logger.info("提醒任务完成,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    // }

    // // 每隔5秒一次
    // @Scheduled(fixedRate = 5000)
    // public void remindTask222(){
    //     logger.info("开始提醒任务222...,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    //     try {
    //         TimeUnit.SECONDS.sleep(8);
    //     } catch (InterruptedException e) {
    //         e.printStackTrace();
    //     }
    //     logger.info("提醒任务222完成,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    // }

    // 上面的定时任务可以解决固定的时间间隔下要重复执行的任务,
    // 但是,要解决每个月1号10点要做的任务,固定任务就无法解决
    // 对于这个需求,可以使用 cron 定时任务来解决
    // cron表达式 描述执行 定时任务时间点一种表达式

    // @Scheduled(cron = "0/5 45 14 ? 7 2")
    // // 当前方法调用的时候,是在一个单独的线程中执行
    // // @Async注解要生效的话,也需要使用@EnableAsync来开启
    // public void remindTask(){
    //     logger.info("开始提醒任务...,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    //     try {
    //         TimeUnit.SECONDS.sleep(2);
    //     } catch (InterruptedException e) {
    //         e.printStackTrace();
    //     }
    //     logger.info("提醒任务完成,当前线程:[{}],当前时间:[{}]",Thread.currentThread().getName(),new Date());
    // }
    /*
    cron表达式有7个部分,spring中只能指定6个部分
    秒   分   时   日   月   星期x 年
    0/5 28    14   14   7   ?
    秒/分: 0-59  *
    时:　0-23 *
    日:  1-31    *
    月:  1-12    *
    星期:　１(星期一)－７(星期日)
    * : 每小时
    0/5: 从0秒开始,每隔5秒一次
    0,10,15:  0秒,10秒,15秒的时候做一次
    10-20: 第10秒到第20秒之间每秒都做一次
    日期和星期之间,只能有一方指定具体值,另外一方就要使用 ? 号
    每周１，３，５的８－１２点每小时执行一次： 0 0 8-12 ? * 2,4,6

      L 最后, #一般出现再星期中,表示第几周,但是,spring的cron表达式中不支持 这些特殊字符
      quartz 定时任务调度的一个框架,可以支持完整的cron表达式
     */

}
